home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / b / b.lha / B / src / bed / lexi.c < prev    next >
C/C++ Source or Header  |  1988-11-24  |  2KB  |  88 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
  2. static char rcsid[] = "$Header: lexi.c,v 2.4 84/10/26 12:01:34 guido Exp $";
  3.  
  4. /*
  5.  * B editor -- Lexical elements (identifiers, keywords, numbers etc.)
  6.  */
  7.  
  8. #include <ctype.h>
  9.  
  10. #include "b.h"
  11. #include "bobj.h"
  12. #include "node.h"
  13. #include "gram.h"
  14.  
  15.  
  16. /*
  17.  * Table defining lexical elements.
  18.  *
  19.  * ********** Indexed by (symbol-LEXICAL).
  20.  */
  21.  
  22. Hidden char lowercase[] = "0123456789'\"abcdefghijklmnopqrstuvwxyz";
  23. Hidden char uppercase[] = "0123456789'\"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  24. Hidden char digits[] = "0123456789";
  25.  
  26. Hidden struct {
  27.     string l_start;
  28.     string l_continue;
  29. } chclass[] = {
  30.     {lowercase+12, lowercase,}, /* IDENT */
  31.     {uppercase+12, uppercase,}, /* KEYWORD */
  32.     {digits, digits,}, /* NUMBER */
  33.     {"\\", "^",}, /* COMMENT */
  34.     {"^`'", "^`'",}, /* TEXT1 */
  35.     {"^`\"", "^`\"",}, /* TEXT2 */
  36.     {".+-*/#^~@|<=>", "",}, /* OPERATORS */
  37.     {"^", "^",}, /* RAW_INPUT */
  38.     {"", "",}, /* SUGGESTION (dummy) */
  39. };
  40.  
  41. #define NCHCLASS (sizeof(chclass)/sizeof(chclass[0]))
  42.  
  43.  
  44. /*
  45.  * Test whether character `c' may start a lexical element with
  46.  * symbolic name `lex'.
  47.  */
  48.  
  49. Visible bool
  50. maystart(c, lex)
  51.     char c;
  52.     int lex;
  53. {
  54.     string cp;
  55.  
  56.     lex -= LEXICAL;
  57.     Assert(lex >= 0);
  58.     if (lex >= NCHCLASS || !isascii(c) || c != ' ' && !isprint(c))
  59.         return No;
  60.     cp = chclass[lex].l_start;
  61.     if (*cp == '^')
  62.         return !index(cp+1, c);
  63.     return index(cp, c) != 0;
  64. }
  65.  
  66.  
  67. /*
  68.  * Test whether character `c' may continue a lexical element with
  69.  * symbolic name `lex'.
  70.  */
  71.  
  72. Visible bool
  73. maycontinue(c, lex)
  74.     char c;
  75.     int lex;
  76. {
  77.     string cp;
  78.  
  79.     lex -= LEXICAL;
  80.     Assert(lex >= 0);
  81.     if (lex >= NCHCLASS || !isascii(c) || c != ' ' && !isprint(c))
  82.         return No;
  83.     cp = chclass[lex].l_continue;
  84.     if (*cp == '^')
  85.         return !index(cp+1, c);
  86.     return index(cp, c) != 0;
  87. }
  88.